#include "Drv_AD7606.h"
#include "gpio.h"
#include "spi.h"
#include "main.h"



static void AD7606_delay_6ns(uint16_t ns)
{
	    for(int i = ns; i > 0; i--){
        __NOP();//1000/168 ns = 5.85ns
    }
}
static void AD7606_Set_Os(AD7606_OS os_type,AD7606_CARD drv)
{
	GPIO_TypeDef 	*GPIO_OS0;
	GPIO_TypeDef 	*GPIO_OS1;
	GPIO_TypeDef 	*GPIO_OS2;
	
	uint16_t 		GPIO_PIN_OS0;
	uint16_t 		GPIO_PIN_OS1;
	uint16_t 		GPIO_PIN_OS2;
	
	uint8_t  		type = (uint8_t)os_type;
	
	switch(drv)
	{
//		case 1:
//			GPIO_OS0 = MCU_OS0_card1_GPIO_Port;
//			GPIO_OS1 = MCU_OS1_card1_GPIO_Port;
//			GPIO_OS2 = MCU_OS2_card1_GPIO_Port;
//			GPIO_PIN_OS0 = MCU_OS0_card1_Pin;
//			GPIO_PIN_OS1 = MCU_OS1_card1_Pin;
//			GPIO_PIN_OS2 = MCU_OS2_card1_Pin;
//			break;
		case 2:
			GPIO_OS0 = OS0_2_GPIO_Port;
			GPIO_OS1 = OS1_2_GPIO_Port;
			GPIO_OS2 = OS2_2_GPIO_Port;
			GPIO_PIN_OS0 = OS0_2_Pin;
			GPIO_PIN_OS1 = OS1_2_Pin;
			GPIO_PIN_OS2 = OS2_2_Pin;
			break;
		default:
			break;
	}
	
	HAL_GPIO_WritePin(GPIO_OS0,GPIO_PIN_OS0,(GPIO_PinState)(type&0x01));
	type = type>>1;
	HAL_GPIO_WritePin(GPIO_OS1,GPIO_PIN_OS1,(GPIO_PinState)(type&0x01));
	type = type>>1;
	HAL_GPIO_WritePin(GPIO_OS2,GPIO_PIN_OS2,(GPIO_PinState)(type&0x01));
	type = type>>1;


}

static void AD7606_Set_Range(AD7606_RANGE RANGE,AD7606_CARD drv)
{
	GPIO_TypeDef 	*GPIO_RAGE;
	uint16_t 			GPIO_PIN_RAGE;
	
	switch(drv)
	{
		case 1:
//			GPIO_RAGE = MCU_RANGE_card1_GPIO_Port;
//			GPIO_PIN_RAGE = MCU_RANGE_card1_Pin;
//			break;
		case 2:
			GPIO_RAGE = RANGE_2_GPIO_Port;
			GPIO_PIN_RAGE = RANGE_2_Pin;
			break;
		default:
			break;
	}
	
	HAL_GPIO_WritePin(GPIO_RAGE,GPIO_PIN_RAGE,(GPIO_PinState)RANGE);	
}


void AD7606Reset(AD7606_CARD drv)
{
    /*! ___|-----|________  >= 50ns */
	GPIO_TypeDef 	*GPIO_RST;
	uint16_t 			GPIO_PIN_RST;

		switch(drv)
	{
//		case 1:
//			GPIO_RST = MCU_RESET_card1_GPIO_Port;
//			GPIO_PIN_RST = MCU_RESET_card1_Pin;
//			break;
		case 2:
			GPIO_RST = RESET_2_GPIO_Port;
			GPIO_PIN_RST = RESET_2_Pin;
			break;
		default:
			break;
	}
	
	
    AD7606Rst_Low(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_High(GPIO_RST,GPIO_PIN_RST);
    AD7606Rst_Low(GPIO_RST,GPIO_PIN_RST);
	
}

void AD7606Init(AD7606_CARD drv)
{

		AD7606_Set_Os(AD7606_OS_16,drv);
		AD7606_Set_Range(AD7606_5V,drv);
		AD7606Reset(drv);

}


void AD7606Start(AD7606_CARD drv)
{
	
	GPIO_TypeDef 	*GPIO_CONVST;
	uint16_t 			GPIO_PIN_CONVST;;

		switch(drv)
	{
//		case 1:
//			GPIO_CONVST = MCU_CONVST_card1_GPIO_Port;
//			GPIO_PIN_CONVST = MCU_CONVST_card1_Pin;
//			break;
		case 2:
			GPIO_CONVST = CONVSET_2_GPIO_Port;
			GPIO_PIN_CONVST = CONVSET_2_Pin;
			break;
		default:
			break;
	}
	AD7606CONVST_High(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606CONVST_LOW(GPIO_CONVST,GPIO_PIN_CONVST);
	AD7606_delay_6ns(500/6+1);
	AD7606CONVST_High(GPIO_CONVST,GPIO_PIN_CONVST);



}

void AD7606Stop(void)
{

}

void AD760616bit_merge(uint8_t buff_8bit[],uint16_t buff_16bit[])
{
	int i;
	for(i = 0;i < 8; i++)
	{
		buff_16bit[i] = (buff_8bit[2*i]<<8) + buff_8bit[i*2+1];
	}
}

void AD7606BusyIrqCallback_8bit(uint8_t *ad7606Val,uint8_t ad7606Chl,AD7606_CARD drv)
{
	
		switch(drv)
		{
//			case AD7606_CARD1:
//				AD7606Cs1_Low();
//				HAL_SPI_Receive_IT(&hspi5,(uint8_t *)ad7606Val,ad7606Chl);
//				while(hspi5.State != HAL_SPI_STATE_READY)
//				{
//				}
//				AD7606Cs1_High();
//				break;
			case AD7606_CARD2:
				HAL_GPIO_WritePin(SPI3_Cs_GPIO_Port, SPI3_Cs_Pin, GPIO_PIN_RESET);
				HAL_SPI_Receive(&hspi3,(uint8_t *)ad7606Val,ad7606Chl,0x01);		
				HAL_GPIO_WritePin(SPI3_Cs_GPIO_Port, SPI3_Cs_Pin, GPIO_PIN_SET);

				break;
		}
		
		AD7606Start(drv);

}



void change_7606(float *adc_now,uint16_t *ad7606Val,AD7606_RANGE RANGE)
{
	int i,vol;
	vol = RANGE == AD7606_5V?5:10;
	for(i = 0; i<8; i++)
	{
		adc_now[i] = 1.0 * ad7606Val[i] * vol / 32767;
	}
}

